#include "util.hpp"
#include "config.hpp"
#include "data.hpp"
#include "hot.hpp"
#include "service.hpp"
#include <thread>

void FileUtilTest(const std::string& filename)
{
    //测试1：获取文件属性
    // cloud::FileUtil fu(filename);
    // std::cout << fu.FileSize() << std::endl;
    // std::cout << fu.LastMTime() << std::endl;
    // std::cout << fu.LastATime() << std::endl;
    // std::cout << fu.FileName() << std::endl;
    
    //测试2：获取文件内容+设置文件内容
    // cloud::FileUtil fu(filename);
    // std::string body;
    // fu.GetContent(&body);//获取文件内容

    // cloud::FileUtil nfu("./hello2.txt");
    // nfu.SetContent(body);
    
    //测试3：测试文件解压缩
    // std::string packname = filename + ".lz";
    // cloud::FileUtil fu(filename);
    // fu.Compress(packname);
    // cloud::FileUtil pfu(packname);
    // pfu.UnCompress("./hello.txt");
    
    //测试4:创建目录，遍历目录下的文件
    cloud::FileUtil fu(filename);
    fu.CreateDirectory();//创建目录
    std::vector<std::string> arry;
    fu.scanDirectory(&arry);
    for(auto& a: arry)
    {
        std::cout << a << std::endl;
    }
    return;
}
void JsonUtilTest()
{
    //序列化
	const char *name = "小明";
	int age = 19;
	float score[] = {85, 88.5, 99};
	Json::Value root;
	root["姓名"] = name;
	root["年龄"] = age;
	root["成绩"].append(score[0]);
	root["成绩"].append(score[1]);
	root["成绩"].append(score[2]);
	std::string json_str;
	cloud::JsonUtil::Serialize(root, &json_str);
	std::cout << json_str << std::endl;

    //反序列化
	Json::Value val;
	cloud::JsonUtil::UnSerialize(json_str, &val);
	std::cout << val["姓名"].asString() << std::endl;
	std::cout << val["年龄"].asInt() << std::endl;
	for(int i = 0; i < val["成绩"].size(); i++) {
		std::cout << val["成绩"][i].asFloat() << std::endl;
	}
}
void ConfigTest()
{
    cloud::Config* config = cloud::Config::GetInstance();//单例对象的句柄
    std::cout << config->GetHotTime() << std::endl;
    std::cout << config->GetServerPort() << std::endl;
    std::cout << config->GetServerIp() << std::endl;
    std::cout << config->GetDownloadPrefix() << std::endl;
    std::cout << config->GetPackFileSuffix() << std::endl;
    std::cout << config->GetPackDir() << std::endl;
    std::cout << config->GetBackDir() << std::endl;
    std::cout << config->GetBackupFile() << std::endl;
}
void DataTest(const std::string& filename)
{
    //1.测试数据信息结构体
    // cloud::BackupInfo info;
    // info.NewBackupInfo(filename);//把文件属性填充到文件信息结构体中
    // std::cout << info.pack_flag <<std::endl;
    // std::cout << info.fsize <<std::endl;
    // std::cout << info.mtime <<std::endl;
    // std::cout << info.atime <<std::endl;
    // std::cout << info.real_path <<std::endl;
    // std::cout << info.pack_path <<std::endl;
    // std::cout << info.url <<std::endl;

    //2.测试数据管理类
    //把文件属性信息填充到文件信息结构体中之后，将文件信息结构体插入到哈希表中(用数据管理类)

    // cloud::BackupInfo info;
	// info.NewBackupInfo(filename);
	// cloud::DataManager data;
	// std::cout << "-----------insert and GetOneByURL--------\n";
	// data.Insert(info);

	// cloud::BackupInfo tmp;
	// data.GetOneByURL("/download/bundle.h", &tmp);
	// std::cout << tmp.pack_flag << std::endl;

	// std::cout << tmp.fsize<< std::endl;
	// std::cout << tmp.mtime<< std::endl;
	// std::cout << tmp.atime<< std::endl;

	// std::cout << tmp.real_path << std::endl;
	// std::cout << tmp.pack_path<< std::endl;
	// std::cout << tmp.url<< std::endl;

    // std::cout<<"---------updata and getall--------\n";

    // info.pack_flag = true;
    // data.Update(info);
    // std::vector<cloud::BackupInfo> arry;
    // data.GetAll(&arry);
    // for(auto &a : arry)
    // {
    //     std::cout << a.pack_flag <<std::endl;
    //     std::cout << a.fsize <<std::endl;
    //     std::cout << a.mtime <<std::endl;
    //     std::cout << a.atime <<std::endl;
    //     std::cout << a.real_path <<std::endl;
    //     std::cout << a.pack_path <<std::endl;
    //     std::cout << a.url <<std::endl;
    // }
    // std::cout<<"---------realpath--------\n";
    // data.GetOneByRealPath(filename,&tmp);
    // std::cout << tmp.pack_flag <<std::endl;
    // std::cout << tmp.fsize <<std::endl;
    // std::cout << tmp.mtime <<std::endl;
    // std::cout << tmp.atime <<std::endl;
    // std::cout << tmp.real_path <<std::endl;
    // std::cout << tmp.pack_path <<std::endl;
    // std::cout << tmp.url <<std::endl;

    //data.Storage();
    cloud::DataManager data;//定义的时候会调用初始化加载函数，将持久化存储文件信息读到哈希表中
    std::vector<cloud::BackupInfo> arry;
    //实际是遍历哈希表，将文件信息存放到arry数组中
    data.GetAll(&arry);
    for(auto &a : arry)
    {
        std::cout << a.pack_flag <<std::endl;
        std::cout << a.fsize <<std::endl;
        std::cout << a.mtime <<std::endl;
        std::cout << a.atime <<std::endl;
        std::cout << a.real_path <<std::endl;
        std::cout << a.pack_path <<std::endl;
        std::cout << a.url <<std::endl;
    }
}
cloud::DataManager* _data;
void HotTest()
{
    cloud::HotManager hot;//热点管理者
    hot.RunModule();
}
void ServiceTest()
{
    cloud::Service srv;
    srv.RunModule();
}
int main(int argc, char* argv[])
{
    _data = new cloud::DataManager();

    //FileUtilTest(argv[1]);
    //JsonUtilTest();
    //ConfigTest();
    //DataTest(argv[1]);
    //HotTest();
    //ServiceTest();
    std::thread thread_hot_manager(HotTest);
    std::thread thread_service(ServiceTest);
    thread_hot_manager.join();
    thread_service.join();

    return 0;
}
